<template>
  <div class="main" style="padding: 20px;background-color: transparent;">
    <a-form :form="form" class="user-layout-login" ref="formLogin" id="formLogin">
     
          <a-form-item>
            <a-input
              size="large"
              v-decorator="['username',validatorRules.username,{ validator: this.handleUsernameOrEmail }]"
              type="text"
              placeholder="请输入帐户名">
              <a-icon slot="prefix" type="user" :style="{ color: 'rgba(0,0,0,.25)' }"/>
            </a-input>
          </a-form-item>

          <a-form-item>
            <a-input
              v-decorator="['password',validatorRules.password]"
              size="large"
              type="password"
              autocomplete="false"
              placeholder="密码">
              <a-icon slot="prefix" type="lock" :style="{ color: 'rgba(0,0,0,.25)' }"/>
            </a-input>
          </a-form-item>

          <a-row :gutter="0">
            <a-col :span="16">
              <a-form-item>
                <a-input
                  v-decorator="['inputCode',validatorRules.inputCode]"
                  size="large"
                  type="text"
                  @change="inputCodeChange"
                  placeholder="请输入验证码">
                  <a-icon slot="prefix" type="smile" :style="{ color: 'rgba(0,0,0,.25)' }"/>
                </a-input>
              </a-form-item>
            </a-col>
            <a-col :span="8" style="text-align: right">
              <img v-if="requestCodeSuccess" style="margin-top: 2px;" :src="randCodeImage" @click="handleChangeCheckCode"/>
              <img v-else style="margin-top: 2px;" src="../../assets/checkcode.png" @click="handleChangeCheckCode"/>
            </a-col>
          </a-row>
      <a-form-item>
        <a-checkbox v-decorator="['rememberMe', {initialValue: true, valuePropName: 'checked'}]" >自动登陆</a-checkbox>
        <!-- <router-link :to="{ name: 'alteration'}" class="forge-password" style="float: right;">
          忘记密码
        </router-link> -->
        <a-popconfirm title="请联系管理员" @confirm="() => handleForget()">
            <a class="forge-password" style="float: right;">忘记密码</a>
          </a-popconfirm>
       <!-- <router-link :to="{ name: 'register'}" class="forge-password" style="float: right;margin-right: 10px" >
          注册账户
        </router-link> -->
      </a-form-item>

      <a-form-item style="margin-top:24px">
        <a-button
          size="large"
          type="primary"
          htmlType="submit"
          class="login-button"
          :loading="loginBtn"
          @click.stop.prevent="handleSubmit"
          :disabled="loginBtn">确定
        </a-button>
      </a-form-item>

      <!-- <div class="user-login-other">
        <span>其他登陆方式</span>
        <a @click="onThirdLogin('github')" title="github"><a-icon class="item-icon" type="github"></a-icon></a>
        <a @click="onThirdLogin('wechat_enterprise')" title="企业微信"><a-icon class="item-icon" type="wechat"></a-icon></a>
        <a @click="onThirdLogin('dingtalk')" title="钉钉"><a-icon class="item-icon" type="dingding"></a-icon></a>
      </div> -->
    </a-form>

    <two-step-captcha
      v-if="requiredTwoStepCaptcha"
      :visible="stepCaptchaVisible"
      @success="stepCaptchaSuccess"
      @cancel="stepCaptchaCancel"></two-step-captcha>
    <login-select-modal ref="loginSelect" @success="loginSelectOk"></login-select-modal>
    <div class="foot-copy">
      <template  v-if="$route.query.codeinfo">
        <p>机构名称：{{$route.query.codeinfo.split('|')[0]}}</p>
        <p> 机构编码：{{$route.query.codeinfo.split('|')[1]}}</p>
      </template>
        <p>ICP备案/许可证号:黑ICP备2024026134号-1</p>
        <p style="width: 100%;">黑龙江省启明码源科技开发有限责任公司&nbsp;&nbsp;业务联系方式：13046176666</p>
    </div>
  </div>
</template>

<script>
  //import md5 from "md5"
  import api from '@/api'
  import TwoStepCaptcha from '@/components/tools/TwoStepCaptcha'
  import { mapActions } from "vuex"
  import { timeFix } from "@/utils/util"
  import Vue from 'vue'
  import { putAction,postAction,getAction } from '@/api/manage'
  import { encryption , getEncryptedString } from '@/utils/encryption/aesEncrypt'
  import store from '@/store/'
  import LoginSelectModal from './LoginSelectModal.vue'
  import { Toast } from 'vant'
  import { ACCESS_TOKEN, USER_DATA,USER_NAME,USER_INFO,USER_AUTH,SYS_BUTTON_AUTH,UI_CACHE_DB_DICT_DATA,TENANT_ID,READDZINFO } from "@/store/mutation-types"
  import md5 from "md5"
  import FingerprintJS from '@fingerprintjs/fingerprintjs';

  export default {
    components: {
      TwoStepCaptcha,
      LoginSelectModal
    },
    data () {
      return {
        loginResult:'',
        websockTime:0,
        customActiveKey: "tab1",
        loginBtn: false,
        // login type: 0 email, 1 username, 2 telephone
        loginType: 0,
        requiredTwoStepCaptcha: false,
        stepCaptchaVisible: false,
        form: this.$form.createForm(this),
        encryptedString:{
          key:"",
          iv:"",
        },
        state: {
          time: 60,
          smsSendBtn: false,
        },
        validatorRules:{
          username:{rules: [{ required: true, message: '请输入用户名!'},{validator: this.handleUsernameOrEmail}]},
          password:{rules: [{ required: true, message: '请输入密码!',validator: 'click'}]},
          mobile:{rules: [{validator:this.validateMobile}]},
          captcha:{rule: [{ required: true, message: '请输入验证码!'}]},
          inputCode:{rules: [{ required: true, message: '请输入验证码!'}]}
        },
        verifiedCode:"",
        inputCodeContent:"",
        inputCodeNull:true,
        currentUsername:"",
        currdatetime:'',
        randCodeImage:'',
        requestCodeSuccess:false,
        browserId:'',
        websock:null
      }
    },
    beforeCreate(){
      Vue.ls.remove(ACCESS_TOKEN)
      Vue.ls.remove('XUFEITEMP');
    },
    created () {
      this.currdatetime = new Date().getTime();
      Vue.ls.remove(ACCESS_TOKEN)
      Vue.ls.remove('XUFEITEMP');
      this.getRouterData();
      this.handleChangeCheckCode();
      if (window.requestIdleCallback) {
        requestIdleCallback(() => {
          this.createFingerprint();
        });
      } else {
        setTimeout(() => {
          this.createFingerprint();
        }, 500);
      }
      // update-begin- --- author:scott ------ date:20190805 ---- for:密码加密逻辑暂时注释掉，有点问题
      //this.getEncrypte();
      // update-end- --- author:scott ------ date:20190805 ---- for:密码加密逻辑暂时注释掉，有点问题
    },
    destroyed(){
      this.websock.onmessage = null;
      this.websock.onerror = null;
      this.websock.close(1000, "安全关闭");
      this.websock = null;
    },
    methods: {
      handleForget(){},
      ...mapActions([ "Login", "Logout","PhoneLogin","ThirdLogin" ]),
      createFingerprint() {
        let that = this;
        FingerprintJS.load().then(fp => {
          fp.get().then(result => {
            that.browserId = result.visitorId
            localStorage.setItem('browserId', result.visitorId);
          });
        });
      },
      //第三方登录
      onThirdLogin(source){
        let url = window._CONFIG['domianURL']+`/thirdLogin/render/${source}`
        window.open(url, `login ${source}`, 'height=500, width=500, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=n o, status=no')
        let that = this;
        let receiveMessage = function(event){
          var origin = event.origin
          console.log("origin",origin);

          let token = event.data
          console.log("event.data",token)
          that.ThirdLogin(token).then(res=>{
            if(res.success){
              that.loginSuccess()
            }else{
              that.requestFailed(res);
            }
          })
        }
        window.addEventListener("message", receiveMessage, false);
      },
      // handler
      handleUsernameOrEmail (rule, value, callback) {
        const regex = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/;
        if (regex.test(value)) {
          this.loginType = 0
        } else {
          this.loginType = 1
        }
        callback()
      },
      handleTabClick (key) {
        this.customActiveKey = key
        // this.form.resetFields()
      },
      getChannelId(){
        let res = this.loginResult
        let userMD5 = `${res.result.userInfo.id}${new Date().getTime()}${this.browserId}`
        return md5(userMD5)
      },
      loginYiLiao(){
        let res = this.loginResult
        var channelId= this.getChannelId();      //多端登录的唯一标识。
        localStorage.setItem('channelId', channelId);
        localStorage.setItem('sourceId', 'haic0134');
        localStorage.setItem('areaCodeCounty', '230208');
        var name = res.result.userInfo.realname;     //当前登录医生的姓名
        var doctorId = res.result.doctorInfo.id;  //当前登录医生的HIS账号
        var deptCode = res.result.officeInfo.id;  //当前登录医生的HIS科室代码
        var orgCode = res.result.medicalInstitution.fixMedInsCode;   //当前登录的机构代码
        var areaCodeCounty = 230208;
        var sourceId = "haic0134";          //智医助理分配给HIS的标识。
        var encodestr = name + "/" + doctorId + "/" +deptCode + "/"+ orgCode + "/" + areaCodeCounty + "/" + sourceId+ "/" +channelId
        console.log(encodestr, 'encodestr');
        var encodeResult = window.btoa(unescape(encodeURIComponent(encodestr)));
       window.location.href="iflyhaic://"+encodeResult;
       Toast({
        duration: 0,
        type: 'loading',
        message: '创建通信中...',
        forbidClick: true,
      });
       this.initWebSocket()
      },

      initWebSocket: function () {
      
      this.websock = new WebSocket('ws://127.0.0.1:23011?token=梅里斯达斡尔族区');
      this.websock.onopen = this.websocketOnopen;
      this.websock.onerror = this.websocketOnerror;
      this.websock.onmessage = this.websocketOnmessage;
      this.websock.onclose = this.websocketOnclose;
    },
    websocketOnopen: function () {
      Toast.clear();
      this.$router.push({ path: "/dashboard/analysis" }).catch(()=>{})
      this.$notification.success({
        message: '欢迎',
        description: `${timeFix()}，欢迎回来`,
      });
      console.log("WebSocket连接成功----------------------");
    },
    websocketOnerror: function (e) {
      console.log("WebSocket连接发生错误-111111111111111222222222222222");
      this.reconnect();
    },
     websocketOnmessage:function (event){
      console.log("WebSocket连接成功11111111111111111");
    },
    websocketOnclose: function (e) {
      console.log("111111111111111222222222222222");
      // this.reconnect();
    },
    websocketSend(text) {
      // 数据发送
      try {
        this.websock.send(text);
      } catch (err) {
        console.log("send failed (" + err.code + ")");
      }
    },
    reconnect() {
      var that = this;
      if(that.lockReconnect) return;
      that.lockReconnect = true;
      that.websockTime +=1
      if(that.websockTime<10){
        //没连接上会一直重连，设置延迟避免请求过多
        setTimeout(function () {
          console.info("尝试重连111111...");
          that.initWebSocket();
          that.lockReconnect = false;
        }, 5000);
      } else {
        Toast.clear();
        Vue.ls.remove(ACCESS_TOKEN)
        Vue.ls.remove(UI_CACHE_DB_DICT_DATA)
        localStorage.removeItemItem('channelId');
        this.$notification[ 'error' ]({
          message: "通信失败",
          duration: 4,
        });
      }
    },



      // 处理登录逻辑的公共方法
      handleLoginCommon(isForceLogin = false) {
        let that = this;
        let loginParams = {};
        that.loginBtn = true;

        const handleLoginSuccess = (res) => {
          this.loginResult = res
          if (res.result.userInfo.pwdInitFlag + '' !== '1') {
            Vue.ls.remove('ISWEAK');
          }
          this.$refs.loginSelect.show(res.result);
        };
        const handleLoginError = (err) => {
          console.log(err, 'errerrerr');
          if (!isForceLogin && err.code == 577) {
            this.$confirm({
              title: '登录设备数受限！',
              content: '当前机构登录设备数，已达上限！请退出其他设备端登录再进行操作！如需开启更多设备请联系管理员！',
              okText: '强制登录',
              onOk() {
                that.$confirm({
                  title: '登录设备数受限！',
                  content: '强制登录会随机踢出已登录的设备，是否确定继续？',
                  okText: '继续',
                  onOk() {
                    that.handleLoginCommon(true);
                  },
                  onCancel() {},
                });
              },
              onCancel() {},
            });
          }
          if (err.message.indexOf('验证码') > -1) {
            this.handleChangeCheckCode();
          }
          that.requestFailed(err);
        };

        // 使用账户密码登录
        if (that.customActiveKey === 'tab1') {
          that.form.validateFields(['username', 'password', 'inputCode', 'rememberMe'], { force: true }, (err, values) => {
            if (!err) {
              loginParams.username = values.username;
              loginParams.password = values.password;
              loginParams.remember_me = values.rememberMe;
              loginParams.captcha = that.inputCodeContent;
              loginParams.checkKey = that.currdatetime;
              if (isForceLogin) {
                loginParams.forceLogin = true;
              }
              console.log("登录参数", loginParams);
              that.Login(loginParams)
                .then(handleLoginSuccess)
                .catch(handleLoginError);
            } else {
              that.loginBtn = false;
            }
          });
        } else {
          // 使用手机号登录
          that.form.validateFields(['mobile', 'captcha', 'rememberMe'], { force: true }, (err, values) => {
            if (!err) {
              loginParams.mobile = values.mobile;
              loginParams.captcha = values.captcha;
              loginParams.remember_me = values.rememberMe;
              that.PhoneLogin(loginParams)
                .then((res) => {
                  console.log(res.result);
                  this.$refs.loginSelect.show(res.result);
                })
                .catch((err) => {
                  that.requestFailed(err);
                });
            }
          });
        }
      },

      // 普通登录
      handleSubmit() {
        this.handleLoginCommon(false);
      },

      // 强制登录
      handleforceLogin() {
        this.handleLoginCommon(true);
      },
      getCaptcha (e) {
        e.preventDefault();
        let that = this;
        this.form.validateFields([ 'mobile' ], { force: true },(err,values) => {
            if(!values.mobile){
              that.cmsFailed("请输入手机号");
            }else if (!err) {
              this.state.smsSendBtn = true;
              let interval = window.setInterval(() => {
                if (that.state.time-- <= 0) {
                  that.state.time = 60;
                  that.state.smsSendBtn = false;
                  window.clearInterval(interval);
                }
              }, 1000);

              const hide = this.$message.loading('验证码发送中..', 0);
              let smsParams = {};
                  smsParams.mobile=values.mobile;
                  smsParams.smsmode="0";
              postAction("/sys/sms",smsParams)
                .then(res => {
                  if(!res.success){
                    setTimeout(hide, 0);
                    this.cmsFailed(res.message);
                  }
                  console.log(res);
                  setTimeout(hide, 500);
                })
                .catch(err => {
                  setTimeout(hide, 1);
                  clearInterval(interval);
                  that.state.time = 60;
                  that.state.smsSendBtn = false;
                  this.requestFailed(err);
                });
            }
          }
        );
      },
      stepCaptchaSuccess () {
        this.loginSuccess()
      },
      stepCaptchaCancel () {
        this.Logout().then(() => {
          this.loginBtn = false
          this.stepCaptchaVisible = false
        })
      },
      handleChangeCheckCode(){
        this.currdatetime = new Date().getTime();
        getAction(`/sys/randomImage/${this.currdatetime}`).then(res=>{
          if(res.success){
            this.randCodeImage = res.result
            this.requestCodeSuccess=true
          }else{
            this.$message.error(res.message)
            this.requestCodeSuccess=false
          }
        }).catch(()=>{
          this.requestCodeSuccess=false
        })
      },
      loginSuccess () {
        // update-begin- author:sunjianlei --- date:20190812 --- for: 登录成功后不解除禁用按钮，防止多次点击
        // this.loginBtn = false
        // update-end- author:sunjianlei --- date:20190812 --- for: 登录成功后不解除禁用按钮，防止多次点击
        this.loginYiLiao();
        // this.$router.push({ path: "/dashboard/analysis" }).catch(()=>{
        //   console.log('登录跳转首页出错,这个错误从哪里来的')
        // })
        
        // this.$notification.success({
        //   message: '欢迎',
        //   description: `${timeFix()}，欢迎回来`,
        // });
      },
      cmsFailed(err){
        this.$notification[ 'error' ]({
          message: "登录失败",
          description:err,
          duration: 4,
        });
      },
      requestFailed (err) {
        this.$notification[ 'error' ]({
          message: '登录失败',
          description: ((err.response || {}).data || {}).message || err.message || "请求出现错误，请稍后再试",
          duration: 4,
        });
        this.loginBtn = false;
      },
      validateMobile(rule,value,callback){
        if (!value || new RegExp(/^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/).test(value)){
          callback();
        }else{
          callback("您的手机号码格式不正确!");
        }

      },
      validateInputCode(rule,value,callback){
        if(!value || this.verifiedCode==this.inputCodeContent){
          callback();
        }else{
          callback("您输入的验证码不正确!");
        }
      },
      generateCode(value){
        this.verifiedCode = value.toLowerCase()
      },
      inputCodeChange(e){
        this.inputCodeContent = e.target.value
      },
      loginSelectOk(){
        this.loginSuccess()
      },
    getRouterData(){
      this.$nextTick(() => {
        if (this.$route.params.username) {
          this.form.setFieldsValue({
            'username': this.$route.params.username
          });
        }
      })
    },
    //获取密码加密规则
    getEncrypte(){
      var encryptedString = Vue.ls.get(ENCRYPTED_STRING);
      if(encryptedString == null){
        getEncryptedString().then((data) => {
          this.encryptedString = data
        });
      }else{
        this.encryptedString = encryptedString;
      }
    },
    }
  }
</script>

<style lang="less" scoped>
  .foot-copy{
    position: absolute;
    color: #000;
    left: 0;
    right: 0;
    bottom: 0;
    text-align: center;
    font-size: 14px;
    display: flex;
    justify-content: center;
    padding: 0 0 5vh;
    flex-wrap: wrap;
    p{
      margin: 0 16px;
    }
  }
  .user-layout-login {
    label {
      font-size: 14px;
    }

    .getCaptcha {
      display: block;
      width: 100%;
      height: 40px;
    }

    .forge-password {
      font-size: 14px;
    }

    button.login-button {
      padding: 0 15px;
      font-size: 16px;
      height: 40px;
      width: 100%;
    }

    .user-login-other {
      text-align: left;
      margin-top: 24px;
      line-height: 22px;

      .item-icon {
        font-size: 24px;
        color: rgba(0,0,0,.2);
        margin-left: 16px;
        vertical-align: middle;
        cursor: pointer;
        transition: color .3s;

        &:hover {
          color: #1890ff;
        }
      }

      .register {
        float: right;
      }
    }
  }

</style>
<style>
  .valid-error .ant-select-selection__placeholder{
    color: #f5222d;
  }

</style>